//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Log.print('service module: energia');
Service.energia = {};

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.energia.stisimo = function(nodereq) {
	var skiniko = nodereq.skinikoGet(), conn, query, trapezi, pektis, partida,
		tablo, pioni, tetragono, idos = 'ΣΤΗΣΙΜΟ', data, energia;

	if (nodereq.isvoli()) return;
	if (nodereq.oxiTrapezi()) return;

	if (!nodereq.url.hasOwnProperty('pioni')) return nodereq.end('Ακαθόριστο πιόνι');
	if (!nodereq.url.hasOwnProperty('tetragono')) return nodereq.end('Ακαθόριστο τετράγωνο');

	trapezi = nodereq.trapeziGet();
	pektis = trapezi.thesiPekti(nodereq.loginGet());
	if (!pektis) return nodereq.end('Δεν είστε παίκτης στο τραπέζι');

	partida = trapezi.partidaGet();
	if (!partida) return nodereq.end('Απροσδιόριστη παρτίδα');

	tablo = trapezi.tabloGet();
	if (!tablo) return nodereq.end('Ακαθόριστο ταμπλό');

	pioni = tablo.pioniGet(pektis, nodereq.url.pioni);
	if (!pioni) return nodereq.end('Απροσδιόριστο πιόνι');

	tetragono = tablo.tetragonoGet(nodereq.url.tetragono);
	if (!tetragono) return nodereq.end('Απροσδιόριστο τετράγωνο');

	energia = new Energia({
		partida: partida.kodikosGet(),
		pektis: pektis,
		idos: idos,
		data: nodereq.url.pioni + '' + nodereq.url.tetragono,
	});

	energia.insertRow(DB.connection(),

	function(conn) {
		conn.free();
		nodereq.end();
		partida.energiaAdd(this);
		tablo.processEnergiaΣΤΗΣΙΜΟ(this);

		skiniko.kinisiAdd(new Kinisi('EG').set({
			e: this.kodikosGet(),
			t: trapezi.kodikosGet(),
			p: pektis,
			i: idos,
			d: this.dataGet(),
		}));
	},

	function(conn) {
		conn.free();
		nodereq.end('Απέτυχε καταχώρηση στησίματος στην database');
	});
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.energia.kinisi = function(nodereq) {
	var skiniko = nodereq.skinikoGet(), conn, query, trapezi, pektis, partida,
		tablo, pioni, tetragono, idos = 'ΚΙΝΗΣΗ', energia;

	if (nodereq.isvoli()) return;
	if (nodereq.oxiTrapezi()) return;

	if (!nodereq.url.hasOwnProperty('pioni')) return nodereq.end('Ακαθόριστο πιόνι');
	if (!nodereq.url.hasOwnProperty('tetragono')) return nodereq.end('Ακαθόριστο τετράγωνο');

	trapezi = nodereq.trapeziGet();
	pektis = trapezi.thesiPekti(nodereq.loginGet());
	if (!pektis) return nodereq.end('Δεν είστε παίκτης στο τραπέζι');

	partida = trapezi.partidaGet();
	if (!partida) return nodereq.end('Απροσδιόριστη παρτίδα');

	tablo = trapezi.tabloGet();
	if (!tablo) return nodereq.end('Ακαθόριστο ταμπλό');

	pioni = tablo.pioniGet(pektis, nodereq.url.pioni);
	if (!pioni) return nodereq.end('Απροσδιόριστο πιόνι');

	tetragono = tablo.tetragonoGet(nodereq.url.tetragono);
	if (!tetragono) return nodereq.end('Απροσδιόριστο τετράγωνο');

	energia = new Energia({
		partida: partida.kodikosGet(),
		pektis: pektis,
		idos: idos,
		data: nodereq.url.pioni + '' + nodereq.url.tetragono,
	});

	DB.connection().transaction(function(conn) {
		Service.energia.kinisi1(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
	});
}

Service.energia.kinisi1 = function(nodereq, conn, skiniko, trapezi, partida, energia, tablo) {
	energia.insertRow(conn,

	function(conn) {
		tablo.processEnergiaΚΙΝΗΣΗ(this);
		if (tablo.nikitisGet()) Service.energia.kinisi2(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
		else Service.energia.kinisiTelos(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
	},

	function(conn) {
		conn.rollback();
		nodereq.end('Απέτυχε καταχώρηση κίνησης στην database');
	});
}

Service.energia.kinisi2 = function(nodereq, conn, skiniko, trapezi, partida, energia, tablo) {
	var nikitis = tablo.nikitisGet();

	partida.telosSetRow(conn, nikitis,

	function(conn) {
		partida.telosSet(nikitis);
		Service.energia.kinisiTelos(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
	},

	function(conn) {
		conn.rollback();
		tablo.replay();
		nodereq.end('Απέτυχε η κατακύρωση της παρτίδας στην database');
	});
}

Service.energia.kinisiTelos = function(nodereq, conn, skiniko, trapezi, partida, energia, tablo) {
	conn.commit();
	nodereq.end();
	partida.energiaAdd(energia);

	skiniko.kinisiAdd(new Kinisi('EG').set({
		e: energia.kodikosGet(),
		t: trapezi.kodikosGet(),
		p: energia.pektisGet(),
		i: energia.idosGet(),
		d: energia.dataGet(),
	}));
},

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.energia.exodos = function(nodereq) {
	var skiniko = nodereq.skinikoGet(), conn, query, trapezi, pektis, partida,
		tablo, tetragono, pioni, idos = 'ΕΞΟΔΟΣ', energia;

	if (nodereq.isvoli()) return;
	if (nodereq.oxiTrapezi()) return;
	if (!nodereq.url.hasOwnProperty('rc')) return nodereq.end('Ακαθόριστο τετράγωνο διαφυγής');

	trapezi = nodereq.trapeziGet();
	pektis = trapezi.thesiPekti(nodereq.loginGet());
	if (!pektis) return nodereq.end('Δεν είστε παίκτης στο τραπέζι');

	partida = trapezi.partidaGet();
	if (!partida) return nodereq.end('Απροσδιόριστη παρτίδα');

	tablo = trapezi.tabloGet();
	if (!tablo) return nodereq.end('Ακαθόριστο ταμπλό');

	tetragono = tablo.tetragonoGet(nodereq.url.rc);
	if (!tetragono) return nodereq.end('Απροσδιόριστο τετράγωνο');

	pioni = tetragono.pioniGet();
	if (!pioni) return nodereq.end('Απροσδιόριστο πιόνι');
	if (pioni.pektisGet() != pektis) return nodereq.end('Ξένο πιόνι στο τετράγωνο διαφυγής');
	if (pioni.oxiGood()) return nodereq.end('Έξοδος με όχι «καλό» φαντασματάκι');

	energia = new Energia({
		partida: partida.kodikosGet(),
		pektis: pektis,
		idos: idos,
		data: pioni.noumeroGet(),
	});

	DB.connection().transaction(function(conn) {
		Service.energia.exodos1(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
	});
}

Service.energia.exodos1 = function(nodereq, conn, skiniko, trapezi, partida, energia, tablo) {
	energia.insertRow(conn,

	function(conn) {
		tablo.processEnergiaΕΞΟΔΟΣ(this);
		if (tablo.nikitisGet()) Service.energia.kinisi2(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
		else Service.energia.kinisiTelos(nodereq, conn, skiniko, trapezi, partida, energia, tablo);
	},

	function(conn) {
		conn.rollback();
		nodereq.end('Απέτυχε καταχώρηση διαφυγής στην database');
	});
}
